package demo;

import org.apache.commons.lang.math.NumberUtils;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;

import java.util.List;
import java.util.Map;

public class MyInterceptor implements Interceptor {
    // 初始化方法
    @Override
    public void initialize() {
        // 初始化方法，不用管
    }

    @Override
    public Event intercept(Event event) {
        // 如果使用了自定义拦截器，那么这个方法会在每一个event经过的时候执行
        // 它的执行次数由event个数 也就是读取的数据行数决定

        /*
        *   需求：对event中包含数据进行判断
        *   如果是纯数字，我们标记为纯数字event在header中
        *   如果不是纯数字，我们标记为字符串event在header中
        *   标记的作用是为了让在conf文件中使用的多路复用选自器进行使用的
        */

        // 获取event中具体的数据
        String body = new String(event.getBody());
        // 判断数据中是否是纯数字
        if (NumberUtils.isNumber(body)){
            Map<String, String> headers = event.getHeaders();
            headers.put("event_type","number");
        }else {
            Map<String, String> headers = event.getHeaders();
            headers.put("event_type","letter");
        }

        // 输出加工后的event
        return event;
    }

    @Override
    public List<Event> intercept(List<Event> list) {
        // 其实在底层，数据的发送总是以批来处理的
        // 批中的event 需要逐个处理
        for (Event event : list) {
            intercept(event);
        }
        return list;
    }

    @Override
    public void close() {
        // 不用管
    }

    public static class Builter implements Interceptor.Builder{

        @Override
        public Interceptor build() {
            return new MyInterceptor();
        }

        @Override
        public void configure(Context context) {

        }
    }

}
